package QianFeng07.IODemo;

import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;

/**
 * 管道流：
 * 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。通常，数据由某个线程
 * 从PipedInputStream对象读取，并由其他线程将其写入到相应的PipedOutputStream。不建议对这两个对象尝
 * 试使用单个线程，因为这样可能死锁线程。管道输入流包含一个缓冲区，可在缓神区限定的范围内将读操作
 * 和写操作分离开。如果向连接管道输出流提供数据字节的线程不再存在，则认为该管道已损坏。
 *
 * 作用：用于线程之间的数据通讯
 *
 * 管道流测试：一个线程写入，一个线程读取
 **/
public class PipedStreamDemo {
    public static <WriteThread> void main(String[] args) {
        PipedInputStream pin = new PipedInputStream();
        PipedOutputStream pout = new PipedOutputStream();
        try {
            pin.connect(pout); //两个管道进行连接
        } catch (IOException e) {
            e.printStackTrace();
        } //输入流与输出流连接

        ReadThread readerThread = new ReadThread(pin);
        QianFeng07.IODemo.WriteThread writeThread = new QianFeng07.IODemo.WriteThread(pout);
        new Thread(readerThread).start();
        new Thread(writeThread).start();
    }
}

//读取数据的线程
class ReadThread implements Runnable {
    private PipedInputStream pin;//输入的管道

    ReadThread(PipedInputStream pin) {
        this.pin = pin;
    }

    public void run() {
        try {
            byte[] buf = new byte[1024];
            int len = pin.read(buf); //read阻塞
            String s = new String(buf, 0, len);
            System.out.println("读到" + s);
            pin.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

//写入数据的线程
class WriteThread implements Runnable {
    private PipedOutputStream pout;//输出管道

    WriteThread(PipedOutputStream pout) {
        this.pout = pout;
    }
    @Override
    public void run() {
        try {
            pout.write("一个美女...".getBytes()); //管道输出流
            pout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
